var HTTP = {
	TYPE_XML: 'XML',
	TYPE_TEXT: 'TEXT',
	/**
	 * 새로운 XMLHttpRequest 객체를 생성해 반환합니다.
	 * @returns XMLHttpRequest
	 */
	getHTTP: function(){
		var xmlhttp = null;
		if (window.XMLHttpRequest) {
			xmlhttp = new XMLHttpRequest();
		} else {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
		
		return xmlhttp;
	},
	/**
	 * 서버로 요청을 보냅니다.
	 * 
	 * @param method: POST, GET과 같은 전송 방식
	 * @param url: 전달 요청 주소
	 * @param callback: 정상 응답일 때 실행할 메서드
	 * @param dataType: 응답받을 데이터 형태
	 */
	send: function(method, url, callback, dataType){
		var request = this.getHTTP();
		var xml = this.TYPE_XML;
		var text = this.TYPE_TEXT;
		request.open(method, url, true);
		request.onreadystatechange = function(){
			if (request.readyState === 4) {
				var response = null;
				var status = request.status;
				if (dataType === xml){
					response = request.responseXML;
				} else if (dataType === text) {
					response = request.responseText;
				}
				// 생성되었던 XMLHttpRequest 객체를 초기화 합니다.
				// 초기화 하지 않을 경우 새로운 요청마다 쌓이게 됩니다.
				request = null;
				// 정상 응답일 경우 전달받은 callback 함수를 실행하고 아니면 알림을 띄운다.
				if (status === 200) {
					callback(response);
				} else if (status === 400) {
					alert('올바르지 못한 요청입니다.');
				} else if (status === 403) {
					alert('보안 문제로 접근이 불가능 합니다.');
				} else if (status === 404) {
					alert('페이지를 찾을 수 없습니다. \n요청 URL을 확인해 주세요.');
				} else if (status === 500) {
					alert('요청한 서버의 오류입니다. 
							\n잠시 후에 다시 시도하거나 관리자에게 문의하세요.');
				} else {
					alert('요청이 올바르게 처리되지 않았습니다.\nStatus Code: ' + status);
				}
			}
		};
		
		request.send();
	},
	/**
	 * GET 방식으로 요청을 보냅니다.
	 * @param url: 전달 요청 주소
	 * @param callback: 정상 응답일 때 실행할 메서드
	 * @param dataType: 응답받을 데이터 형태
	 */
	get: function(url, callback, dataType){
		this.send('GET', url, callback, dataType);
	},
	
	/**
	 * POST 방식으로 요청을 보냅니다.
	 * @param url: 전달 요청 주소
	 * @param callback: 정상 응답일 때 실행할 메서드
	 * @param dataType: 응답 받을 데이터 형태
	 */
	post: function(url, callback, dataType){
		this.send('POST', url, callback, dataType);
	},
	
	/**
	 * XML 형태의 응답을 받는 요청을 GET 방식으로 요청합니다. 
	 * @param url: 전달 요청 주소
	 * @param callback: 정상 응답일 때 실행할 메서드
	 */
	getXML: function(url, callback){
		this.send('GET', url, callback, this.TYPE_XML);
	},
	/**
	 * XML 형태의 응답을 받는 요청을 POST 방식으로 요청합니다. 
	 * @param url: 전달 요청 주소
	 * @param callback: 정상 응답일 때 실행할 메서드
	 */
	postXML: function(url, callback, dataType, dataType){
		this.send('POST', url, callback, this.TYPE_XML);
	},
	/**
	 * TEXT형태의 응답을 받는 요청을 GET 방식으로 요청합니다. 
	 * @param url: 전달 요청 주소
	 * @param callback: 정상 응답일 때 실행할 메서드
	 */
	getText: function(url, callback){
		this.send('GET', url, callback, this.TYPE_TEXT);
	},
	/**
	 * TEXT 형태의 응답을 받는 요청을 POST 방식으로 요청합니다. 
	 * @param url: 전달 요청 주소
	 * @param callback: 정상 응답일 때 실행할 메서드
	 */
	postText: function(url, callback, dataType, dataType){
		this.send('POST', url, callback, this.TYPE_TEXT);
	}
};
